package api;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.Blog;
import model.BlogDao;
import model.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;


/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2024-04-10
 * Time: 12:50
 *
 * 通过这个类实现 一些 后端 提供的接口
 */

// 按照约定来进行下面代码的编写过程
@WebServlet("/blog")
public class BlogServlet extends HttpServlet {
    private ObjectMapper  objectMapper = new ObjectMapper();// 把查询出来的结果 转换成 json  格式

    // 对于博客详情页：需要显示所有的博客的列表 ，所以 前端传过来一个 get 请求，我们要返回 这个 用户ID下的所有博客才行
    // 博客内容存在数据库中，所以需要使用之前 封装好的对数据库的操作的代码来取数据
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String blogId = req.getParameter("blogId");
        // 请求中 查询一下 在 query string 中 是否有 blogId
        // 如果有就是查询一个博客
        // 如果没有就是 查询所有的博客

        // 博客内容存在数据库中，所以需要使用之前 封装好的对数据库的操作的代码来取数据
        BlogDao blogDao = new BlogDao();

        if(blogId==null){
            List<Blog> list = blogDao.selectAll();// 这样就把所需要的数据查到了

            //把查询出来的结果 转换成 json  格式
            String respstring = objectMapper.writeValueAsString(list);

            //构造响应
            resp.setContentType("application/json;charset=utf8");

            resp.getWriter().write(respstring);
        }else{
            Blog blog = blogDao.selectOne(Integer.parseInt(blogId));// 这样就把所需要的数据查到了

            //把查询出来的结果 转换成 json  格式
            String respstring = objectMapper.writeValueAsString(blog);

            //构造响应
            resp.setContentType("application/json;charset=utf8");

            resp.getWriter().write(respstring);
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 实现发布博客的功能，新写的 博客 点击发布文章之后，存储到数据库，页面跳转到 博客列表页
        // 这里的请求使用 的 from表单 ： post /blog
        // Content-Type : application/x-www-form-urlencoded
        // 请求的body部分： title=标题&content=…………

        // 响应： HTTP/1.1 302 (302是跳转的意思)
        // Location:blog_list.html

        // 为了正确获取字符串，这里要设置一下
        req.setCharacterEncoding("utf8");

        // 因为 这里使用的是form 表单的形式，所以可以直接返回一个 HTML 格式的数据，
        // 如果是 ajax 格式进行提交的，那就最好不直接返回 HTML 格式的数据


        // 1. 从请求中拿到 标题和正文
        String title = req.getParameter("title");
        String content = req.getParameter("content");
        // 判断 标题和正文是否为空
        if(title==null || title.equals("") || content==null || content.equals("")){
            // 博客的标题或者正文 存在缺失，插入失败
            String html = "<h3>title 或者 content 为空，新增博客失败</h3>";
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write(html);
            return;
        }

        // 2. 从会话中拿到 作者的 ID （user对象）
        HttpSession session = req.getSession(false);
        // 会话是否存在
        if(session==null){
            String html = "<h3>用户未登录，新增博客失败</h3>";
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write(html);
            return;
        }
        // 判断 user对象是否存在
        User user = (User) session.getAttribute("user");
        if(user==null){
            String html = "<h3>用户未登录，新增博客失败</h3>";
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write(html);
            return;
        }

        // 3. 可以开始 构造 blog 对象了
        Blog blog = new Blog();

        blog.setUseId(user.getUseId());
        blog.setTitle(title);
        blog.setContent(content);
        // 如何获取当前的时间作为 博客的发布时间：
        blog.setDataTime(new Timestamp(System.currentTimeMillis()));

        // 4. 把这个 blog 对象 插入到 数据库中
        BlogDao blogDao = new BlogDao();
        blogDao.insert(blog);

        // 5. 博客插入数据库之后，就跳转到博客的列表页去
        resp.sendRedirect("blog_list.html");


    }
}
